package so.obligatorio.procesos;

import java.util.concurrent.Semaphore;

import so.obligatorio.Reloj;

public abstract class Proceso extends Thread{
	private Semaphore hiloStop;
	
	private Semaphore semPausa;
	private boolean pausa;

	public Proceso(Reloj reloj) {
		reloj.registrar(this);
		this.hiloStop = new Semaphore(0);
		this.semPausa = new Semaphore(1);
		this.pausa = false;

	}

	@Override
	public void run() {
//		int count= 0;
		int turnopasado = 0;
		while(Reloj.getInstance().isKeepRunning()) {

			if(turnopasado > 0) {
				assert(turnopasado + 1 == Reloj.getInstance().getTurno());
			}
//			System.out.println(this.getClass().toString() + " is running in turn " + Reloj.getInstance().getTurno());

			procesar();
			turnopasado = Reloj.getInstance().getTurno();
			pausar();

//			Descomentar solo para hacer testing
//			try {
//				sleep(1500);
//			} catch (InterruptedException e) {
//				e.printStackTrace();
//			}
//			count++;
		}
	}

	private void pausar() {
		try {
			this.hiloStop.acquire();
		} catch (InterruptedException e) {
			e.printStackTrace();
			this.pausa = false;
		}
	}

	public void continuar() {
		this.hiloStop.release();
	}

	protected abstract void procesar();

	public boolean terminoTurno() {
		return this.getState().equals(State.WAITING);
	}
}
